﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.IO;
using TiflolibrosLibEntity;

namespace TifloLibrosLibData
{
    public class UsuariosDA
    {
        public UsuariosDA()
        {
        }

        #region Métodos Privados
        private UsuariosEntity CrearUsuario(SqlDataReader cursor)
        {
            UsuariosEntity usuario = new UsuariosEntity();
            usuario.Id = cursor.GetInt32(cursor.GetOrdinal("id_genero"));
            usuario.Nombre = cursor.GetString(cursor.GetOrdinal("nombre"));
            usuario.Apellido = cursor.GetString(cursor.GetOrdinal("apellido"));
            usuario.Email = cursor.GetString(cursor.GetOrdinal("mail"));
            usuario.FechaNacimiento = cursor.GetDateTime(cursor.GetOrdinal("fnacimiento"));
            usuario.Domicilio = cursor.GetString(cursor.GetOrdinal("domicilio"));

            if (!cursor.IsDBNull(cursor.GetOrdinal("localidad_ciudad")))
                usuario.LocalidadCiudad = cursor.GetString(cursor.GetOrdinal("localidad_ciudad"));
            
            usuario.EstadoProvincia = cursor.GetString(cursor.GetOrdinal("estado_provincia"));

            if (!cursor.IsDBNull(cursor.GetOrdinal("codigopostal")))
                usuario.CodigoPostal = cursor.GetString(cursor.GetOrdinal("codigopostal"));
            
            usuario.Pais = cursor.GetString(cursor.GetOrdinal("pais"));
            usuario.Telefono = cursor.GetString(cursor.GetOrdinal("telefono"));
            usuario.TipoDiscapacidadID = cursor.GetInt32(cursor.GetOrdinal("tipo_discapacidad"));

            if (!cursor.IsDBNull(cursor.GetOrdinal("otra_discapacidad")))
                usuario.OtraDiscapacidad = cursor.GetString(cursor.GetOrdinal("otra_discapacidad"));
            
            usuario.GrupoDiscusion = cursor.GetBoolean(cursor.GetOrdinal("grupo_discusion"));
            usuario.EstadoID = cursor.GetInt32(cursor.GetOrdinal("id_estado"));

            if (!cursor.IsDBNull(cursor.GetOrdinal("nombre_comprobante")))
                usuario.NombreComprobante = cursor.GetString(cursor.GetOrdinal("nombre_comprobante"));

            if (!cursor.IsDBNull(cursor.GetOrdinal("password")))
                usuario.Password = cursor.GetString(cursor.GetOrdinal("password"));

            return usuario;
        }
        #endregion Métodos Privados

        #region Métodos Públicos
        public void Insertar(UsuariosEntity usuarios)
        {
            try
            {
                using (SqlConnection conexion = ConexionDA.ObtenerConexion())
                {
                    using (SqlCommand comando = new SqlCommand("usuariosinsert", conexion))
                    {
                        comando.CommandType = CommandType.StoredProcedure;
                        SqlCommandBuilder.DeriveParameters(comando);
                        comando.Parameters["@nombre"].Value = usuarios.Nombre;
                        comando.Parameters["@apellido"].Value = usuarios.Apellido;
                        comando.Parameters["@mail"].Value = usuarios.Email;
                        comando.Parameters["@fnacimiento"].Value = usuarios.FechaNacimiento;
                        comando.Parameters["@domicilio"].Value = usuarios.Domicilio;
                        comando.Parameters["@localidad_ciudad"].Value = usuarios.LocalidadCiudad;
                        comando.Parameters["@estado_provincia"].Value = usuarios.EstadoProvincia;
                        comando.Parameters["@codigopostal"].Value = usuarios.CodigoPostal;
                        comando.Parameters["@pais"].Value = usuarios.Pais;
                        comando.Parameters["@telefono"].Value = usuarios.Telefono;
                        comando.Parameters["@tipo_discapacidad"].Value = usuarios.TipoDiscapacidadID;
                        comando.Parameters["@otra_discapacidad"].Value = usuarios.OtraDiscapacidad;
                        comando.Parameters["@grupo_discucion"].Value = usuarios.GrupoDiscusion;
                        comando.Parameters["@nombre_comprobante"].Value = usuarios.NombreComprobante;
                        comando.ExecuteNonQuery();

                        usuarios.Id = Convert.ToInt32(comando.Parameters["@RETURN_VALUE"].Value);
                    }
                    
                    conexion.Close();
                }
            }
            catch (Exception ex)
            {
                throw new ExcepcionDA("Se produjo un error al insertar el usuario.", ex);
            }
        }

        public void ActualizarPassword(int id, string password)
        {
            try
            {
                using (SqlConnection conexion = ConexionDA.ObtenerConexion())
                {
                    using (SqlCommand comando = new SqlCommand("ConfirmacionCuenta", conexion))
                    {
                        comando.CommandType = CommandType.StoredProcedure;
                        SqlCommandBuilder.DeriveParameters(comando);
                        comando.Parameters["@id"].Value = id;
                        comando.Parameters["@password"].Value = password;
                        comando.ExecuteNonQuery();
                    }

                    conexion.Close();
                }
            }
            catch (Exception ex)
            {
                throw new ExcepcionDA("Se produjo un error al actualizar la contraseña.", ex);
            }
        }

        public bool ExisteEmail(string email)
        {
            try
            {
                bool existeEmail;

                using (SqlConnection conexion = ConexionDA.ObtenerConexion())
                {
                    using (SqlCommand comando = new SqlCommand("UsuariosBuscarEmail", conexion))
                    {
                        comando.CommandType = CommandType.StoredProcedure;
                        SqlCommandBuilder.DeriveParameters(comando);

                        comando.Parameters["@Email"].Value = email.Trim();
                        existeEmail = Convert.ToBoolean(comando.ExecuteScalar());
                    }

                    conexion.Close();
                }

                return existeEmail;
            }
            catch (Exception ex)
            {
                throw new ExcepcionDA("Se produjo un error al buscar por email.", ex);
            }
        }

        public UsuariosEntity BuscarUsuario(string email, string password)
        {
            try
            {
                UsuariosEntity usuario = null;
                
                using (SqlConnection conexion = ConexionDA.ObtenerConexion())
                {
                    using (SqlCommand comando = new SqlCommand("UsuariosBuscarPorEmailPassword", conexion))
                    {
                        comando.CommandType = CommandType.StoredProcedure;
                        SqlCommandBuilder.DeriveParameters(comando);

                        comando.Parameters["@Email"].Value = email.Trim();
                        comando.Parameters["@Password"].Value = password.Trim();
                        
                        using (SqlDataReader cursor = comando.ExecuteReader())
                        {
                            if (cursor.Read())
                            {
                                usuario = CrearUsuario(cursor);
                            }

                            cursor.Close();
                        }
                    }

                    conexion.Close();
                }

                return usuario;
            }
            catch (Exception ex)
            {
                throw new ExcepcionDA("Se produjo un error al buscar por email y contraseña.", ex);
            }
        }
        #endregion Métodos Públicos
    }
}
